var express = require('express');
var router = express.Router();
const { Category } = require('../../models');
const { Op } = require('sequelize'); //模糊查询 op为操作符
const { NotFoundError, success, failure } = require('../../utlis/response');
/* 查询所有分类. */
router.get('/', async function (req, res, next) {
  try {
    // res.render('index', { name: 'Express' });
    const query = req.query; //查询条件
    const currentPage = Math.abs(Number(query.page)) || 1; //当前页  Math.abs 取绝对值
    const pageSize = Math.abs(Number(query.pageSize)) || 10; //每页的数量
    const offSet = (currentPage - 1) * pageSize;
    const condition = {
      order: [['id', 'DESC']], // 数据排序 倒序
      limit: pageSize,
      offSet: offSet,
    };
    if (query.name) {
      condition.where = {
        name: {
          [Op.like]: `%${query.name}%`,
        },
      };
    }
    // const categories = await Category.findAll(condition);//普通的查询全部数据
    const { count, rows } = await Category.findAndCountAll(condition); //分页查询需要计算
    success(res, '查询成功', {
      categories: rows,
      pagination: {
        total: count,
        currentPage,
        pageSize,
      },
    });
    // res.json({
    //   status: '0000',
    //   message: '查询成功',
    //   data: {
    //     categories: rows,
    //     pagination: {
    //       total: count,
    //       currentPage,
    //       pageSize,
    //     },
    //   },
    // });
  } catch (error) {
    failure(res, error);
    // res.status(500).json({
    //   status: '9999',
    //   message: '查询失败',
    //   error: [error.message],
    // });
  }
});
/* 查询单条分类. */
router.get('/:id', async function (req, res, next) {
  try {
    // const { id } = req.params;
    // const categories = await Category.findByPk(id);
    const categories = await getCategory(req);
    success(res, '查询成功', { categories });
    // res.json({
    //   status: '0000',
    //   message: '查询成功',
    //   data: categories,
    // });
    // if (categories) {
    //   res.json({
    //     status: '0000',
    //     message: '查询成功',
    //     data: categories,
    //   });
    // } else {
    //   res.status(404).json({
    //     status: '9999',
    //     message: '查询失败',
    //     data: '分类未找到',
    //   });
    // }
  } catch (error) {
    failure(res, error);
    // res.status(500).json({
    //   status: '9999',
    //   message: '查询失败',
    //   error: [error.message],
    // });
  }
});
/* 创建分类. */
router.post('/', async function (req, res, next) {
  try {
    // const categories = await Category.create(req.body);//直接传入req.body会将用户传入的所有数据进行处理
    const body = filterBody(req);
    console.log(body,'body');
    const categories = await Category.create(body);
    console.log(categories,'create');
    success(res, '新增成功', { categories }, 201);
    // res.status(201).json({
    //   status: '0000',
    //   message: '新增成功',
    //   data: categories,
    // });
  } catch (error) {
    failure(res, error);
    // if (error.name == 'SequelizeValidationError') {
    //   const error = error.errors.map((e) => e.message);
    //   res.status(400).json({
    //     status: '9999',
    //     message: '新增失败',
    //     error,
    //   });
    // } else {
    //   failure(res, error);
    //   res.status(500).json({
    //     status: '9999',
    //     message: '新增失败',
    //     error: [error.message],
    //   });
    // }
  }
});
/* 删除分类. */
router.delete('/:id', async function (req, res, next) {
  try {
    // const { id } = req.params;
    // const categories = await Category.findByPk(id);
    const categories = await getCategory(req);
    await categories.destroy(); //先查再删
    success(res, '删除成功');
    // res.json({
    //   status: '0000',
    //   message: '删除成功',
    // });
    // if (categories) {
    //   await categories.destroy(); //先查再删
    //   res.json({
    //     status: '0000',
    //     message: '返回成功',
    //     data: categories,
    //   });
    // } else {
    //   res.status(404).json({
    //     status: '9999',
    //     message: '删除失败',
    //     data: '分类未找到',
    //   });
    // }
  } catch (error) {
    failure(res, error);
    // res.status(500).json({
    //   status: '9999',
    //   message: '删除失败',
    //   error: [error.message],
    // });
  }
});
/* 更新分类. */
router.put('/:id', async function (req, res, next) {
  try {
    // const { id } = req.params;
    // const categories = await Category.findByPk(id);
    // if (categories) {
    //   await categories.update(req.body); //先查再删
    //   res.json({
    //     status: '0000',
    //     message: '更新成功',
    //     data: categories,
    //   });
    // } else {
    //   res.status(404).json({
    //     status: '9999',
    //     message: '更新失败',
    //     data: '分类未找到',
    //   });
    // }
    const categories = await getCategory(req);
    await categories.update(req.body); //先查再删
    res.json({
      status: '0000',
      message: '查询成功',
      data: categories,
    });
  } catch (error) {
    failure(res, error);
    // res.status(500).json({
    //   status: '9999',
    //   message: '更新失败',
    //   error: [error.message],
    // });
  }
});

/**
 * 公共方法:白名单过滤
 * @param {*} req
 * @returns { name,rank,}
 */

function filterBody(req) {
  const { name, rank } = req.body;
  return {
    name,
    rank,
  };
}

async function getCategory(req) {
  const { id } = req.params;
  const categories = await Category.findByPk(id);
  if (!categories) {
    throw new NotFoundError(`ID:${id}的分类未找到`);
  }
  return categories;
}

module.exports = router;
